package com.founder.devwork.service;

public interface GitImportService {
    public enum INSTANCE {
        BEIJING,
        CHENGDU
    }

    /**
     * 导入GitLab已有仓库
     *
     * <h4>算法：</h4>
     * <ol>
     * <li>获取GitLab API中的所有仓库</li>
     * <li>获取数据库中存储的仓库信息</li>
     * <li>更新数据库中的仓库信息
     *     <ul>
     *         <li>如果数据库中没有该仓库，则将仓库信息插入数据库</li>
     *         <li>如果数据库中存在该仓库，则更新仓库信息</li>
     *     </ul>
     * </li>
     *
     * </ol>
     *
     * @param instance 实例
     */
    public void importRepos(INSTANCE instance);

    /**
     * 导入GitLab已有用户
     *
     * <h4>算法：</h4>
     * <ol>
     * <li>获取GitLab API中的所有用户</li>
     * <li>获取数据库中存储的账户信息</li>
     * <li>更新数据库中的账户信息
     *     <ul>
     *         <li>如果数据库中没有该账户，则将账户信息插入数据库</li>
     *         <li>如果数据库中存在该账户，则更新账户信息</li>
     *     </ul>
     * </li>
     * </ol>
     *
     * @param instance 实例
     */
    public void importAccounts(INSTANCE instance);

    /**
     * 导入GitLab提交记录
     *
     * <h4>算法：</h4>
     * <ol>
     * <li>注册导入工作记录，登记状态为导入中</li>
     * <li>获取所有repository信息</li>
     * <li>过滤出活跃的repository</li>
     * <li>为活跃的repository,补充branch信息</li>
     * <li>依据repo和branch信息，获取提交记录（因为成都的旧版GitLab，不支持 repository/{repoId/commits?all=ture 参数，只支持 repository/{repoId}/commits?ref_name=branch）</li>
     * <li>过滤重复的提交记录sha值（因为，多个branch，可以指向同一个commit，用以体现一个提交合并到不同的分支）</li>
     * <li>依据sha值，从gitlab api获取提交记录</li>
     * <li>将提交记录批量保存到数据库中（过程中校验各个字段，是否符合要求）</li>
     * <li>如果导入失败，则更新导入工作记录，登记状态为导入失败</li>
     * <li>更新导入工作记录，登记状态为导入完成</li>
     * </ol>
     *
     * @param instance 实例
     * @param start 开始日期 格式: 2025-01-01
     * @param end 结束日期 格式: 2025-01-01
     */
    public void importCommits(INSTANCE instance, String start, String end);

    /**
     * 导入GitLab提交记录
     * 导入指定月份的提交记录, 会自动计算出开始日期和结束日期
     * 调用{@link #importCommits(INSTANCE, String, String)}方法，导入指定月份的提交记录
     *
     * @param instance 实例
     * @param month 月份 格式: 2025-01
     * 比如导入2025-01的提交记录, 会自动计算出开始日期为2025-01-01, 结束日期为2025-01-31
     * 作为参数，实际传递的是2025-01-01, 结束日期为2025-02-01，因为gitlab的api会按照2025-02-01的零点，计算
     */
    public void importCommitsByMonth(INSTANCE instance, String month);

    /**
     * 导入GitLab提交记录，采用合成算法，利用现有的数据库中存储的repo信息，对gitlab api发送请求获得提交记录
     *
     * <h4>算法：</h4>
     * <ol>
     * <li>获取数据库中存储的repo信息</li>
     * <li>依据repo的id和branch，对gitlab api发送请求获得提交记录</li>
     * <li>过滤重复的提交记录sha值（因为，多个branch，可以指向同一个commit，用以体现一个提交合并到不同的分支）</li>
     * <li>依据sha值，从gitlab api获取提交记录</li>
     * <li>将提交记录批量保存到数据库中（过程中校验各个字段，是否符合要求）</li>
     * <li>如果导入失败，则更新导入工作记录，登记状态为导入失败</li>
     * <li>更新导入工作记录，登记状态为导入完成</li>
     * </ol>
     *
     * @param instance 实例
     * @param start 开始日期 格式: 2025-01-01
     * @param end 结束日期 格式: 2025-01-01
     */
    public void importCommitsByCompose(INSTANCE instance, String start, String end);

    /**
     * 导入GitLab提交记录，采用合成算法，利用现有的数据库中存储的repo信息，对gitlab api发送请求获得提交记录
     * 导入指定月份的提交记录, 会自动计算出开始日期和结束日期
     * 调用{@link #importCommitsByCompose(INSTANCE, String, String)}方法，导入指定月份的提交记录
     *
     * @param instance 实例
     * @param month 月份 格式: 2025-01
     * 比如导入2025-01的提交记录, 会自动计算出开始日期为2025-01-01, 结束日期为2025-01-31
     * 作为参数，实际传递的是2025-01-01, 结束日期为2025-02-01，因为gitlab的api会按照2025-02-01的零点，计算
     */
    public void importCommitsByComposeByMonth(INSTANCE instance, String month);
}
